package yl.hs.bmipfull.service.flow;

import yl.hs.bmipfull.pojo.flow.FlowInfoEntity;
import yl.hs.bmipfull.service.IBaseService;
import yl.hs.bmipfull.viewmodels.PageQuery;
import yl.hs.bmipfull.viewmodels.PageResult;
import yl.hs.bmipfull.viewmodels.flow.FlowInfoViewModel;

import java.util.List;
import java.util.Map;

/**
 * 作用:  流程信息服务层接口<br/>
 * 创建时间: 2021年06月22日 14时30分49秒 <br/>
 *
 * @author 张凯
 */

public interface IFlowInfoService extends IBaseService {

    /**
     * 查询流程信息信息
     *
     * @param pageQuery 查询条件 {@link PageQuery}
     * @return 流程信息-List<{@link FlowInfoEntity}>
     * @throws Exception 查询参数异常
     */
    List<FlowInfoEntity> queryList(PageQuery pageQuery) throws Exception;

    /**
     * 查询流程信息信息
     *
     * @param pageQuery 查询条件 {@link PageQuery}
     * @param rowNum    每页条数
     * @param page      页码
     * @return 站内信息-List-SiteMessageMainEntity
     * @throws Exception 查询条件异常
     */
    PageResult<FlowInfoEntity> queryPage(PageQuery pageQuery, int rowNum, int page) throws Exception;


    /**
     * 根据流程信息编号查询流程信息信息
     *
     * @param sn 编号
     * @return 流程信息-{@link FlowInfoEntity}
     */
    FlowInfoEntity findBySn(String sn);

    /**
     * 保存流程信息信息
     *
     * @param flowInfoViewModel 流程信息表单信息
     * @return 执行结果-受影响行数-Integer
     * @throws Exception 保存异常
     * @apiNote 保存时如果节点发生改变，则将原有流程改为已过期。重新创建新的流程，若未改变则执行更新
     */
    Integer saveFlowInfo(FlowInfoViewModel flowInfoViewModel) throws Exception;


    /**
     * 保存流程信息
     *
     * @param flowInfo 流程基本信息
     * @return 执行结果
     */
    Integer saveFlowInfo(FlowInfoEntity flowInfo) throws Exception;

    /**
     * 根据流程信息编号删除流程信息信息
     *
     * @param sn 流程信息编号
     * @return 影响行数
     */
    Integer delete(String[] sn);

    /**
     * 根据流程信息编号删除流程信息信息
     *
     * @param sn 流程信息编号
     * @return 影响行数
     */
    Integer delete(String sn);


    /**
     * 查找流程信息
     *
     * @param dataTypeCode 数据编码
     * @param state        数据状态
     * @return 流程信息-{@link FlowInfoEntity}
     */
    FlowInfoEntity findByDataTypeAndState(String dataTypeCode, short state);

    /**
     * 保存流程信息
     *
     * @param model 流程表单信息
     * @param sn    流程信息原有编号
     * @return 执行结果-受影响行数-Integer
     * @throws Exception 保存异常
     */
    Integer saveFlowInfo(Map<String, Object> model, String sn) throws Exception;

    /**
     * 验证当前数据类型代码已经存在
     *
     * @param dataTypeCode 数据类型代码
     * @param sn           数据编号
     * @return 是否存在
     */
    Boolean checkDataTypeCode(String dataTypeCode, String sn);

    /**
     * 根据状态修改状态
     *
     * @param setState   修改状态值
     * @param whereState 条件状态
     * @return 受影响行数
     */
    Integer updateStateByState(short setState, short whereState);
}